package javaAdvanced;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 这是一个注解
 * @interface  注解
 *
 * @author cuiH
 * Date: 13-12-3
 */

/**
 * 元注解  最基本的注解 例如@Retention
 * jdk5提供的四个元注解：@Retention @Target @Document @Inherit
 * Retention（保留）  声明周期
 *
 * Source:源文件阶段    eg@Override @SuppressWarnings
 * Class:class阶段（默认）   因此：当默认情况，写代码时刻可以正常调用，但是输出isAnnotationPresent（。。）是已经是运行期，输出为false
 * Runtime:运行阶段      eg:@Deprecated
 */
@Retention(RetentionPolicy.RUNTIME)

/**
 * @Target 声明该注解使用的对象，方法 还是类，还是接口。。。
 * 例子中如果只写method，写在类上面会报错
 * eg:@Override 的target就是Method
 */
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface AnnotationOne {
    /**
     * java 注解可以在用的时候添加属性，类似于方法
     * @return
     */

    String color() default "blue";      //注解的抽象方法
    String value();


    /**
     * 思考：参考@Retention(RetentionPolicy.RUNTIME)
     * 可以在注解的方法中添加：枚举类型的变量
     * 下面两个例子是数组和枚举，作为参数类型的枚举
     */

    int[] arrayAttr() default {3,3};                                           //数组类型
    EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;              //枚举类型
    AnnotationSec annotationAttr() default @AnnotationSec("annotation default value");                 //注解类型（注解套用注解）
}
